#include "StringArray.h"

template<class T>
StringArray::StringArray() 
{ 
	al = 10; 
	l = -1; 
	data = new T*[al+1]; 
	memset(data,0,(al+1)*LD); 
}

template<class T>
StringArray::~StringArray()
{
	RemoveAll();
	delete [] data;
}

template<class T>
bool StringArray::FindEntry(T* s, int& i) const
{
	for(i=0; i<=l; i++)
	{
		if (strcmp(data[i],s)==0) return true;
	}
	return false;	
}

template<class T>
int StringArray::FindEntry(T* s) const
{
	int i = -1;
	if (FindEntry(s,i))
	{
		return i;
	}
	return -1;
}

template<class T>
bool StringArray::Resize(int ns, bool a)
{
	if (a) ns+= al;
	if (ns>al)
	{
		al = ns;
		char** nd = new T*[al+1];
		memset(nd,0,(al+1)*LD);
		
		if (!nd) return false;
		
		memcpy(nd,data,(l+1)*LD);
		delete [] data;
		data = nd;
	}
	else
	{
		for(int i = al;i>=ns;i--)
		{
			delete [] data[i];
			data[i] = NULL;
		}
	}
	return true;
}

template<class T>
bool StringArray::SetAt(int idx, char* s)
{
	if (idx<=l)
	{
		T* ns = new T[strlen(s)+1];
		if (!ns) return false;

		memcpy(ns,s,strlen(s)+1);
		data[idx] = ns;
	}
	else
		Add(s);

	return true;
}

template<class T>
bool StringArray::Insert(int idx,T* s)
{
	if (l+1>=al)
	{
		Resize(10, true);
	}
	for(int i=l; i>=idx; i--)
		data[i+1] = data[i];

	l++;
	return SetAt(idx,s);
}

template<class T>
bool StringArray::Add(T* s)
{
	if (l+1>=al && !Resize(10,true)) return false;
	
	char * ns = new T[strlen(s)+1];
	if (!ns) return false;

	memcpy(ns,s,strlen(s)+1);
	data[++l] = ns;
	return true;
}

template<class T>
bool StringArray::Append(const StringArray& s)
{
	for(int i=0;i<=s.l;i++)
	{
		if (!Add(s.data[i])) return false;
	}
	return true;
}

template<class T>
bool StringArray::Remove(int idx)
{
	if (idx>l) return false;
	delete [] data[idx];
	memcpy(&data[idx],&data[idx+1],(l-idx+1)*LD);
	l--;
	return true;
}

template<class T>
bool StringArray::Remove(char* s)
{
	int i;
	bool rc = false;
	if (FindEntry(s,i))
	{
		if (Remove(i))
		{
			rc = true;
			Remove(s);
		}
	}
	return rc;
}

template<class T>
bool StringArray::RemoveAll()
{
	while(l>-1)
	{
		delete [] data[l];
		data[l--] = NULL;
	}
	return true;
}

template<class T>
String<T>& StringArray::GetAt(int idx)
{
	if (idx<=l)	
		ts = data[idx];
	else
		ts = "";
	return ts;
}

template<class T>
T* &StringArray::operator[](int idx)
{
    return data[idx];
}
